import XEUtils from 'xe-utils'
import { randomCode } from '@/utils'

/**
 * 检测文件类型是否符合指定的accept
 * @param file
 * @param accept
 */
export function checkFileType(file: File, accept: string) {
    if (!accept) {
        return true // 如果没有设置 accept 属性，则默认匹配所有文件类型
    }

    const acceptedTypes = accept.split(',')

    for (let i = 0; i < acceptedTypes.length; i++) {
        const fileType = acceptedTypes[i].trim()

        if (fileType === '*') {
            return true // 如果 accept 属性值是通配符，匹配任何文件类型
        }

        if (fileType.startsWith('.')) {
            // 根据文件扩展名匹配
            const fileExtension = file.name
                .substring(file.name.lastIndexOf('.'))
                .toLowerCase()
            if (fileType.toLowerCase() === fileExtension) {
                return true
            }
        } else if (fileType.endsWith('/*')) {
            // 根据 MIME 类型的主类型匹配
            const mainType = fileType.substring(0, fileType.indexOf('/'))
            if (file.type.startsWith(mainType)) {
                return true
            }
        } else {
            // 根据完整的 MIME 类型匹配
            if (file.type === fileType) {
                return true
            }
        }
    }

    return false
}

/**
 * 根据文件原文件名和规则字符串，生成一个新的字符串。
 * 如果规则字符串是 /abc/{ori}，生成的就是 /abc/原文件名.原文件后缀名
 * 如果规则字符串是/abc/a.{oriSuffix}，生成的就是 /abc/a.原文件后缀名
 * 如果规则字符串是/abc/{oriName}.jpg ，生成的就是/abc/原文件名.jpg
 * 如果规则字符串是/abc/{random(10)}/{ori}，生成的就是/abc/10位随机字符串/原文件名.原文件后缀名
 * 如果规则字符串是/abc/{date(yyyyMMdd)}/1.jpg ，生成的就是 /abc/当前日期按照yyyyMMdd格式化后的字符串/1.jpg
 * 如果规则字符串是 /abc/{date}/1.jpg ,生成的就是 /abc/当前日期按照yyyyMMddHHmmss格式化后的字符串/1.jpg
 * @param originalFileName 原文件名
 * @param pattern 生成规则
 */
export function generatePath(originalFileName: string, pattern: string) {
    const newString = pattern
        .replace(/{\s*random\(\s*(\d+)\s*\)\s*}/g, function (match, length) {
            const randomString = randomCode(parseInt(length))
            return randomString
        })
        .replace(/{\s*ori\s*}/g, originalFileName)
        .replace(
            /{\s*oriName\s*}/g,
            originalFileName.substring(0, originalFileName.lastIndexOf('.'))
        )
        .replace(
            /{\s*oriSuffix\s*}/g,
            originalFileName.substring(originalFileName.lastIndexOf('.') + 1)
        )
        .replace(/{\s*date\(([^)]+)\)\s*}/g, function (match, pattern) {
            return XEUtils.toDateString(new Date(), pattern)
        })
        .replace(/{\s*date\s*}/g, XEUtils.toDateString(new Date(), 'yyyyMMddHHmmss'))

    return newString
}
